package com.itlong.cloud.property.service;

import com.itlong.cloud.POJO.DTO.property.PropertyRoleGetPageDTO;
import com.itlong.cloud.POJO.DTO.property.PropertyUserLoginDTO;
import com.itlong.cloud.POJO.PO.PropertyFunctionPO;
import com.itlong.cloud.POJO.PO.PropertyRolePO;
import com.itlong.cloud.POJO.VO.operate.OperateGetRoleMenuVO;
import com.itlong.cloud.POJO.VO.property.PropertyGetRoleUserVO;
import com.itlong.cloud.POJO.VO.property.PropertyParentFunctionVO;
import com.itlong.cloud.POJO.VO.property.PropertyRoleVO;
import com.itlong.cloud.utils.page.Page;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业-角色信息业务处理接口
 * </desc>
 *
 * @createDate 2017/09/25
 */
public interface IPropertyRoleService {

    /**
     * <desc>
     *      获取物业管理员角色 ：集团物业管理员，物业管理员，独立开发者
     * </desc>
     *
     * @return
     */
    List<PropertyRolePO> getRootRoles();

    /**
     * <desc>
     *      保存角色菜单资源
     * </desc>
     *
     * @param roleId 角色id
     * @param functionIds 资源id 多个,号分隔
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @version 1.0
     */
    Integer saveRoleFunction(String roleId, String functionIds,String projectId,String propertyApp) throws Exception;







    /**
     * <desc>
     *      保存角色
     * </desc>
     *
     * @param propertyRoleGetPageDTO 角色实体
     * @return sql执行行数
     * @author Jiaqi.X
     * @createDate 2017/09/25
     */
    Integer save(PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;
    /**
     * <desc>
     *      更新角色
     * </desc>
     *
     * @param propertyRoleGetPageDTO 资源角色实体
     * @return sql执行行数
     * @author Jiaqi.X
     * @createDate 2017/09/25
     */
    Integer update(PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;
    /**
     * <desc>
     *      通过id获取角色
     * </desc>
     *
     * @param propertyRolePO 角色实体
     * @return 角色实体
     * @author Jiaqi.X
     * @createDate 2017/09/25
     */
    PropertyRolePO getOne(PropertyRolePO propertyRolePO);

    /**
     * <desc>
     *      获取分页数据
     * </desc>
     *
     * @param pageDTO 查询参数DTO
     * @return page模型
     * @author Jiaqi.X
     * @createDate 2017/09/25
     */
    Page<PropertyRoleVO> getPage(PropertyRoleGetPageDTO pageDTO) throws Exception;

    /**
     * <desc>
     *      删除角色
     * </desc>
     *
     * @param roleIds 角色id数组
     * @return sql执行行数
     * @author Jiaqi.X
     * @createDate 2017/09/25
     */
    Integer delete(String roleIds);

    /**
     * <desc>
     *      保存角色菜单资源
     * </desc>
     *
     * @param roleId 角色id
     * @param functionIds 资源id 多个,号分隔
     * @return
     * @author Jiaqi.X
     * @version 1.0
     */
    Integer saveRoleFunction(String roleId,String functionIds);


    /**
     * <desc>
     *      为角色分配人员
     * </desc>
     *
     * @param roleId    角色id
     * @param allotUsers    需要分配的人员id 多个，号分隔
     * @param userIds 当前列表所有人员id 多个，号分隔
     * @return sql执行行数
     * @author Jiaqi.X
     * @createDate 2017/10/10
     */
    Integer saveRoleUsers(String roleId,String allotUsers,String userIds);

    /**
     * <desc>
     *       根据字段参数查询
     * </desc>
     *
     * @param params    查询参数
     * @return List<PropertyRolePO> 返回数据集合
     * @author Biao.R
     * @createDate 2017/10/17
     */
    List<PropertyRolePO> getByFields(Map<String, Object> params);

    /**
     * <desc>
     *      角色分配菜单按钮权限前，查询角色菜单和按钮
     *      角色的菜单权限不能超出物业管理员的菜单和按钮权限
     * <desc/>
     * @param   propertyRoleGetPageDTO  物业角色查询对象
     * @return
     * @author Biao.R
     * @createDate 2017/10/26
     */
    List<PropertyParentFunctionVO> getRoleFunctions(PropertyRoleGetPageDTO propertyRoleGetPageDTO);

    /**
     * <desc>
     *      查询物业角色拥有的菜单及按钮权限
     * <desc/>
     * @param  propertyUserLoginDTO 登录DTO
     * @return  List<PropertyParentFunctionVO>  查询得到的菜单按钮VO
     * @author Biao.R
     * @createDate 2017/10/16
     */
    List<OperateGetRoleMenuVO> getFunctions(PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      点击左边菜单后，根据角色获取按钮权限
     * <desc/>
     * @param   propertyUserLoginDTO     物业用户登录DTO
     * @return  查找到的按钮数据集
     * @author Biao.R
     * @createDate 2017/10/12
     */
    List<OperateGetRoleMenuVO> getAuthBtns(PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      根据角色获取菜单按钮的信息
     * <desc/>
     * @param   roleId  当前项目的角色ID
     * @param   token  登录令牌
     * @return  查询到的按钮信息
     * @author Biao.R
     * @createDate 2017/11/27
     */
    List<PropertyFunctionPO> getFunctionsByRole(String roleId, String token);

    /**
     * <desc>
     *      通过component和roleId  反向获取对应菜单functionId
     * <desc/>
     * @param  identifier    操作对应的按钮标识
     * @return  该该按钮所在的菜单ID
     * @author Biao.R
     * @createDate 2017/11/30
     */
    String getFunctionIdByIdentifier( String identifier);

    /**
     * <desc>
     *      查询指定角色所有用户
     * </desc>
     *
     * @param projectId 项目id
     * @param roleId 角色id
     * @return 用户列表
     * @author wangzhi
     * @createDate 2018/08/15
     */
    List<PropertyGetRoleUserVO> getRoleUser(String projectId, String roleId);

    /**
     * <desc>
     *      查询角色物业app字段
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/24
     */
    String getRolePropertyApp(PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;

}
